<?php
namespace broadcast\payment;

use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;

//支付宝支付
class AlipayPay
{
    protected  $config = [
        'app_id'            =>      '',                //沙箱应用的APPID
        'notify_url'        =>      '',                //服务器端回调地址,必须是线上可访问的
        'return_url'        =>      '',                //前端回调地址
        'ali_public_key'    =>      '',                //注意: 这里不是应用公钥,是支付宝公钥
        'private_key'       =>      '',                // 加密方式： **RSA2**  
        // 使用公钥证书模式，请配置下面两个参数，同时修改ali_public_key为以.crt结尾的支付宝公钥证书路径，如（./cert/alipayCertPublicKey_RSA2.crt）
        // 'app_cert_public_key' => './cert/appCertPublicKey.crt', //应用公钥证书路径
        // 'alipay_root_cert' => './cert/alipayRootCert.crt', //支付宝根证书路径
        'log' => [
            'file'          =>      '',
            'level'         =>      'info',             // 建议生产环境等级调整为 info，开发环境为 debug
            'type'          =>      'single',           // optional, 可选 daily.
            'max_file'      =>      30                  // optional, 当 type 为 daily 时有效，默认 30 天
        ],
        'http' => [
            'timeout'           =>  5.0,
            'connect_timeout'   =>  5.0
        ],
        'mode'                  => 'dev'                // optional,设置此参数，将进入沙箱模式                                                  
    ];
    public function __construct ($info)
    {
        $this->config['app_id']  = $info['app_id'];
        $this->config['notify_url']  = $info['notify_url'];
        $this->config['return_url']  = $info['return_url'];
        $this->config['ali_public_key']  = $info['ali_public_key'];
        $this->config['private_key']  = $info['private_key'];
        $this->config['log']['file'] = app()->getRuntimePath() . 'log/alipay.log';
    }

    //开启支付
    public function pay ($data)
    {
        $order = [
            'out_trade_no' => date('YmdHis').mt_rand(1000, 9999),
            'total_amount' => $data['money'],
            'subject'      => '支付宝充值'
        ];
        
        if ($data['type'] == 'mobile') {
            $alipay = Pay::alipay($this->config)->wap($order);
        }else{
            $alipay = Pay::alipay($this->config)->web($order);
        }

        return $alipay->send();
    }

    public function return()
    {
        $data = Pay::alipay($this->config)->verify(); // 是的，验签就这么简单！
        return $data;
        // 订单号：$data->out_trade_no
        // 支付宝交易号：$data->trade_no
        // 订单总金额：$data->total_amount
    }

    public function notify()
    {
        $alipay = Pay::alipay($this->config);
    
        try{
            $data = $alipay->verify(); // 是的，验签就这么简单！

            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况

            Log::debug('Alipay notify', $data->all());
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success()->send();// laravel 框架中请直接 `return $alipay->success()`
    }

}
